/***********************************************************************
 * Module:  DefaultDataBaseResource.java
 * Author:  wuxinyang
 * Purpose: Defines the Class DefaultDataBaseResource
 ***********************************************************************/

package com.witframework.plugin.lucene.resource.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;

import com.witframework.plugin.lucene.IndexException;
import com.witframework.plugin.lucene.index.ResourceProcessor;
import com.witframework.plugin.lucene.resource.ResourceMetaData;

/**
 *  缺省的数据库数据资源实现类，对于数据库索引可以通过调用该资源注册类实现
 *  该类需要数据库元数据配置信息建立索引。<P>
 *  该类提供了为数据库数据建立索引的一种途径，不是针对特定单一数据库资源的
 *  实现，可以对任何数据库实体对象（PO）建立索引。<P>
 *  总是通过显示调用该类的方法完成对特定数据库资源的建立索引任务，
 *  因此该类不能够对相对静态的数据库数据
 *  自动建立索引。<P>
 *  <blockquote>example:<pre>
 *  //resourceName ：资源名称
 *  DefaultDataBaseResource dbr=new DefaultDataBaseResource("resourceName");
 *  //resourceProcessor:ResourceProcessor对象实例
 *  dbr.setResourceProcessor(resourceProcessor);
 *  dbr.addBeanAsDocument(bean);
 *  dbr.extractDocuments();
 * </pre></blockquote>
 *
 * @pdOid 16112887-c71c-44d8-b49c-e78933c3c203
 */
public class DynamicDataBaseResource extends AbstractResource {

	private String resourceName;

	private List<Document> docsBuffer=new ArrayList<Document>();
	public DynamicDataBaseResource(){

	}
	public DynamicDataBaseResource(String resourceName){
		this.resourceName=resourceName;
	}
	/**
	 * 根据元数据为bean建立索引,该方法生成Document对象，
	 * 并调用父类的<code>addDocument(Document doc)</code>将该Document对象
	 * 加入缓存，通过调用<code>extractDocuments()</code>方法建立索引。<P>
	 * 注意该方法不处理bean的byte[]类型的属性。因为这个方法认为byte[]类型的属性的值为
	 * 数据附件。因此需要手工构建对附件的索引，对于包含附件的数据，
	 * 可通过如下示例方法建立索引
	 *  <blockquote>example:<pre>	 *
	 *  DefaultDataBaseResource dbr=new DefaultDataBaseResource("resourceName");
	 *  dbr.setResourceProcessor(resourceProcessor);
	 *  Document doc=createDocument(bean);//按照元数据建立索引
	 *  String contents=wordTextBuilder.getText(is);//is为附件的输入流
	 *  //加入对附件内容的处理
	 *  doc.add(new Field("contents",contents,Field.Store.YES,Field.Index.TOKENIZE));
	 *  doc.add(new Field("id",bean.getId(),Field.Store.YES,Field.Index.TOKENIZE);
	 *  dbr.addDocument(doc);
	 *  dbr.extractDocuments();//建立索引
	 * @param bean	 *
	 */
	public void addBeanAsDocument(Object bean){
		//读取元数据
		if(resourceName==null)
			resourceName=bean.getClass().getSimpleName();
		ResourceMetaData rmd = getMetaData(resourceName);
		BeanDocumentHandler handler=new BeanDocumentHandler();
		Document doc=handler.createDocument(bean,rmd);
		docsBuffer.add(doc);
	}
	public int extractDocuments(ResourceProcessor holder) throws IndexException {
		int size=docsBuffer.size();
		for(Document doc:docsBuffer){
			holder.addDocument(doc);
		}
		docsBuffer.clear();
		return size;
	}

}